﻿//数据表

#ifndef DATA_H
#define DATA_H

#include <QObject>
#include <QDebug>
enum state
{
    CLEAR,
    BLOCK,
    START,
    END,
    OUTPUT,
    OPEN,
    CLOSED,
    PATH,
};
class Point
{
public:
    int x, y;
    Point() : x(0), y(0){};
    Point(int _x, int _y) : x(_x), y(_y){};
    bool operator==(const Point &)const;
    Point operator+(const Point &)const;
    Point operator-(const Point &)const;
};

class OutputData
{
    friend class Map;
    Point pre;
    int flag;
    QString str;
public:
    OutputData(/*Point coordinate,*/Point pre,int flag,QString str);
    Point getPre();
    int getFlag();
    const QString& getText();


    //void getOutput();
};

class Map : public QObject
{
    Q_OBJECT

    Point size;//地图长宽
    Point start, end;//起点    //终点
    QVector<QVector<bool>> block;//障碍物二维数组
    QVector<QVector<OutputData *>> outputData;//输出显示二维数组

signals:
    void mapChanged(Point);//通知迷宫方格改变
    void map_output(Point);//通知迷宫方格输出信息改变

public:
    Map();//初始化默认大小迷宫
    Map(Point size);//初始化大小为size的迷宫
    ~Map();//析构函数
    Point Size() const;//返回迷宫大小
    int X() const;//返回迷宫长度
    int Y() const;//返回迷宫高度

    bool isOutOfRange(Point)const;//判断坐标是否在迷宫外
    void setStart(Point);//设置起点坐标
    void setEnd(Point);//设置终点坐标
    void swap();//交换起点终点
    void setBlock(Point p, bool set = BLOCK);//设置障碍物
    void set(Point, int state);//设置方格状态
    bool isBlock(Point) const;//返回方格有无障碍
    int is(Point) const;//返回方格状态
    Point getStart()const;//返回起点坐标
    Point getEnd()const;//返回终点坐标

    void output(Point p,Point pre=Point(-1,-1),int flag=0,QString="");//输出显示方格前驱、状态等信息
    void changeState(Point p,int flag){//输出显示方格状态
        output(p,Point(-1,-1),flag);
    }
    void clearOutputData(Point p);//清除方格输出显示
    OutputData* getOutput(Point p)const;//返回方格输出信息
    bool isOutput(Point p)const;//返回方格有无输出信息
    QString getText(Point p)const;//返回方格其他信息
    int getFlag(Point p)const;//返回方格状态
    int getPreInt(Point p)const;//返回方格前驱
    void clearData();//清除所有方格输出显示
};

// class Open
// {
//     //
// };

// class Data : public QObject
// {
//     Q_OBJECT

//     //地图
//     Map *map;
//     Open *open;
//     //......

// public:
//     explicit Data(QObject *parent = nullptr);

//     void setMap();
//     //终止搜索
//     void stop();

// signals:

//     //绘制搜索过程
//     void paint(Node *node);
// };

#endif // DATA_H
